package com.code.test.second.array;

import java.util.Arrays;

public class SCode977 {
    public static void main(String[] args) {
        int[] arr = {-4, -1, 0, 3, 10};
        square2(arr);
        System.out.println(Arrays.toString(arr));

    }

    /**
     * 非递减顺序的整数列表，返回每个数字的平方，升序
     * 实质就是 数组里面有负数，平方后是正数，然后按照计算完后的值重新排序
     */
    public static void square(int[] nums) {
        for (int i = 0; i < nums.length; i++) {
            nums[i] = nums[i] * nums[i];
        }
        Arrays.sort(nums);
    }

    /**
     *  因为数组是升序，所以负数的值平方后，跟整数的平方比，可能比较大
     *  所以用一个数组来存新的结果，最终得到的就是排序后的
     *  这里面相当于从左向右，每个数比较大小，然后把大的以此放到数组里
     */
    public static int[] square2(int[] nums) {
        int k = nums.length - 1;
        int left = 0;
        int right = nums.length - 1;
        int[] res = new int[nums.length];
        while (left < right) {
            //左边平方
            int leftValue = nums[left] * nums[left];
            //右边平方
            int rightValue = nums[right] * nums[right];
            if (leftValue < rightValue) {
                //左边小于右边
                res[k--] = rightValue;
                right--;
            } else {
                res[k--] = leftValue;
                left++;
            }
        }
        return res;
    }

}
